function add(a, b) {
    var c, d, e;
    try {
        c = a.toString().split(".")[1].length;
    } catch (f) {
        c = 0;
    }
    try {
        d = b.toString().split(".")[1].length;
    } catch (f) {
        d = 0;
    }
    return e = Math.pow(10, Math.max(c, d)), (mul(a, e) + mul(b, e)) / e;
}

function sub(a, b) {
    var c, d, e;
    try {
        c = a.toString().split(".")[1].length;
    } catch (f) {
        c = 0;
    }
    try {
        d = b.toString().split(".")[1].length;
    } catch (f) {
        d = 0;
    }
    return e = Math.pow(10, Math.max(c, d)), (mul(a, e) - mul(b, e)) / e;
}

function mul(a, b) {
    var c = 0,
        d = a.toString(),
        e = b.toString();
    try {
        c += d.split(".")[1].length;
    } catch (f) {}
    try {
        c += e.split(".")[1].length;
    } catch (f) {}
    return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}

function div(a, b) {
    var c, d, e = 0,
        f = 0;
    try {
        e = a.toString().split(".")[1].length;
    } catch (g) {}
    try {
        f = b.toString().split(".")[1].length;
    } catch (g) {}
    return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), mul(c / d, Math.pow(10, f - e));
}

Number.prototype.add = function (arg) {
    return add(this, arg);
};

Number.prototype.sub = function (arg) {
    return sub(this, arg);
};

Number.prototype.mul = function (arg) {
    return mul(this, arg);
};

Number.prototype.div = function (arg) {
    return div(this, arg);
};
/**
 * 12345 => $12,345.00
 *
 * @param {String} sign
 * @param {Number} decimals Decimal places
 */
function currency(value, _currency, decimals) {
	var digitsRE = /(\d{3})(?=\d)/g;
	value = parseFloat(value);
	if (!isFinite(value) || !value && value !== 0) return '';
	_currency = _currency != null ? _currency : '$';
	decimals = decimals != null ? decimals : 2;
	var stringified = Math.abs(value).toFixed(decimals);
	var _int = decimals ? stringified.slice(0, -1 - decimals) : stringified;
	var i = _int.length % 3;
	var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';
	var _float = decimals ? stringified.slice(-1 - decimals) : '';
	var sign = value < 0 ? '-' : '';
	return sign + _currency + head + _int.slice(i).replace(digitsRE, '$1,') + _float;
}

Number.prototype.currency = function (arg1, arg2) {
    return currency(this, arg1, arg2);
};
